package app.xx.marquee.text

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet


class MarqueeText : androidx.appcompat.widget.AppCompatTextView, Runnable {
    private var currentScrollX = 0 // 当前滚动的横向位置
    private var isStop = false // 是否停止
    private var speed = 5 // 滚动速度
    private var textWidth = 0 // 跑马灯字体的宽度
    private var isMeasure = false // 是否已经测量来这个view要展示的字体长度

    companion object {
        val RIGHT = 0
        val LEFT = 1
    }

    /**
     * 自定义控件的构造函数
     */

    constructor(context: Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )


    private var scrollOrientation: Int = LEFT // 滚动方向 （0是向右滚 1是向左滚）
    private val colors = intArrayOf(
        Color.BLUE, Color.GREEN, Color.WHITE,
        Color.YELLOW, Color.RED, Color.BLACK
    )
    private var i = 0 // 文字变换颜色的索引


    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        if (!isMeasure) {
            getTextWidth();
            isMeasure = true;
        }
    }

    /**
     * 重写父类的setText方法，给跑马灯设置展示的文字
     */
    override fun setText(text: CharSequence?, type: BufferType?) {
        super.setText(text, type)
        isMeasure = false
        getTextWidth()
    }

    private fun getTextWidth() {
        val paint: Paint = this.paint // 得到画笔
        val str = this.text.toString() // 得到给这个view设置的文字
        textWidth = paint.measureText(str).toInt() // 得到了文字的宽度并赋值给这个对象的textWidth属性
    }

    override fun run() {
        if (scrollOrientation == LEFT) {
            currentScrollX += speed
            scrollTo(currentScrollX, 0);
            if (isStop) {
                return // 停止
            }
            if (scrollX >= textWidth) {// 当滚动到文字的末尾时
                scrollTo(-this.width, 0)// 滚回到
                currentScrollX = -this.width
            }else{
                println("aksjdlakjsdkl")
            }

        } else if (scrollOrientation == RIGHT) {
            currentScrollX -= speed;// 滚动的速度
            scrollTo(currentScrollX, 0);// 滚动到currentScrollX位置(此处是文字滚动,实际上这个view并没有滚动)
            if (isStop) {
                return; // 停止
            }
            if (scrollX <= -(this.width)) {// 当滚动的位移超过这个view的宽度的时候
                scrollTo(textWidth, 0);// 滚回到
                currentScrollX = textWidth;
            }
        }

        this.setTextColor(colors[i]);
        this.isSelected = true
        i++
        if (i == colors.size) {
            i = 0
        }
        postDelayed(this, 10);// 10毫秒后把这个runnable对象再次放入消息队列中，使其可以再次执行run方法
    }

    fun startScroll() {
        isStop = false
        removeCallbacks(this) // 清除消息队列里的runnable对象
        post(this) // 把这个runnable对象放入消息队列中 然后开始执行run里面的方法
    }

    fun stopScroll() {
        currentScrollX = 0
        isStop = true
    }

    fun startFor0() {
        currentScrollX = 0
        startScroll()
    }

    fun left() {
        currentScrollX = 0
        scrollOrientation = LEFT
        startScroll()
    }

    fun right() {
        currentScrollX = 0
        scrollOrientation = RIGHT
        startScroll()
    }

    fun addSpeed() {
        if (speed < 50) {
            speed += speed
        }
    }

    fun reduceSpeed() {
        if (speed > 1) {
            speed -= 1
        }
    }
}